package logger

import (
	"path"
	"runtime"

	"github.com/sirupsen/logrus"
)

// CallerHook 自定义Hook结构体，用于添加函数名、行号等信息到日志中
type CallerHook struct{}

// Levels 实现logrus.Hook接口的Levels方法，指定在哪些日志级别触发该Hook
func (h *CallerHook) Levels() []logrus.Level {
	return logrus.AllLevels
}

// Fire 实现logrus.Hook接口的Fire方法，在日志记录时添加额外信息，并处理文件名显示为绝对路径的问题
func (h *CallerHook) Fire(entry *logrus.Entry) error {
	// 调整调用栈，以获取更准确的文件名和行号
	pc, file, line, ok := runtime.Caller(9)
	if ok {
		funcName := runtime.FuncForPC(pc).Name()
		// 使用path.Base获取文件名部分（去除路径），得到更简洁的文件名展示
		shortFileName := path.Base(file)
		entry.Data["func"] = funcName
		entry.Data["file"] = shortFileName
		entry.Data["line"] = line
	}
	return nil
}
